package com.itaming.lycheeframework.mybatisflex.base;

import com.itaming.lycheeframework.support.utils.ObjectUtil;
import com.mybatisflex.core.BaseMapper;
import com.mybatisflex.core.query.QueryCondition;
import com.mybatisflex.core.query.QueryWrapper;
import com.mybatisflex.spring.service.impl.ServiceImpl;

import java.io.Serializable;
import java.util.function.Supplier;

/**
 * 基础服务实现类
 *
 * @author A.Ming
 */
public class BaseServiceImpl<M extends BaseMapper<T>, T> extends ServiceImpl<M, T> implements BaseService<T> {

    /**
     * 根据<code>ID</code>查询
     *
     * @param id              ID
     * @param exceptionIfNull 查询结果为空时的异常
     * @return 查询结果
     */
    @Override
    public T getById(Serializable id, Supplier<? extends RuntimeException> exceptionIfNull) {
        return ObjectUtil.throwIfNull(super.getById(id), exceptionIfNull);
    }

    /**
     * 根据实体<code>ID</code>查询
     *
     * @param entity          实体
     * @param exceptionIfNull 查询结果为空时的异常
     * @return 查询结果
     */
    @Override
    public T getOneByEntityId(T entity, Supplier<? extends RuntimeException> exceptionIfNull) {
        return ObjectUtil.throwIfNull(super.getOneByEntityId(entity), exceptionIfNull);
    }

    /**
     * 根据条件查询
     *
     * @param queryWrapper    查询条件
     * @param exceptionIfNull 查询结果为空时的异常
     * @return 查询结果
     */
    @Override
    public T getOne(QueryWrapper queryWrapper, Supplier<? extends RuntimeException> exceptionIfNull) {
        return ObjectUtil.throwIfNull(super.getOne(queryWrapper), exceptionIfNull);
    }

    /**
     * 根据条件查询，转为指定类型
     *
     * @param query           查询条件
     * @param asType          类型
     * @param exceptionIfNull 查询结果为空时的异常
     * @return 查询结果
     */
    @Override
    public <R> R getOneAs(QueryWrapper query, Class<R> asType, Supplier<? extends RuntimeException> exceptionIfNull) {
        return ObjectUtil.throwIfNull(super.getOneAs(query, asType), exceptionIfNull);
    }

    /**
     * 根据条件查询
     *
     * @param condition       查询条件
     * @param exceptionIfNull 查询结果为空时的异常
     * @return 查询结果
     */
    @Override
    public T getOne(QueryCondition condition, Supplier<? extends RuntimeException> exceptionIfNull) {
        return ObjectUtil.throwIfNull(super.getOne(condition), exceptionIfNull);
    }

}
